package cn.xwt.weidisk.util;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @author 薛慰涛
 */
@Component
public class RedisUtils {
    @Resource
    private RedisTemplate<Object, Object> redisTemplate;

    /**
     * RedisUtil的初始化方法
     */
    @PostConstruct
    public void init() {
        // 设置序列化器类型 防止乱码
        StringRedisSerializer serializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setValueSerializer(serializer);
    }

    /**
     * 存一个键值对
     * @param key key
     * @param value 要存的值
     */
    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 获取一个键的值
     * @param key key
     * @return String 获取到的值
     */
    public String get(String key) {
        if (key == null) {
            return "";
        }
        return (String)redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除一个key
     * @param key 要删除的key
     * @return true 删除成功
     */
    public Boolean del(String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 存一个过期时间为秒的值
     * @param key key
     * @param value 要存的值
     * @param second 有效时间
     */
    public void setSecondExpireKey(String key, String value, long second) {
        redisTemplate.opsForValue().set(key, value, second, TimeUnit.SECONDS);
    }

    /**
     * 存一个过期时间为分钟的值
     * @param key key
     * @param value 要存的值
     * @param minute 有效时间
     */
    public void setMinuteExpireKey(String key, String value, long minute) {
        redisTemplate.opsForValue().set(key, value, minute, TimeUnit.MINUTES);
    }

    /**
     * 获取并删除key
     * @param key 要删除的key
     * @return 获取到的值
     */
    public String getAndDelKey(String key) {
        String value = (String)redisTemplate.opsForValue().get(key);
        redisTemplate.delete(key);
        return value;
    }
}
